<?php

/**
 * User Model for NiceAuth Plugin
 *
 * NiceAuth : User Authentication and Authorization Plugin for CakePHP
 * Copyright 2011, R.S.Martin (http://rsmartin.me)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @author RSMartin
 * @copyright Copyright (c) 2011, RSMartin (http://rsmartin.me)
 * @license http://www.opensource.org/licenses/mit-license.php MIT
 */
App::uses('NiceAuthAppModel', 'NiceAuth.Model');

class User extends NiceAuthAppModel {

    var $name = 'User';
    public $belongsTo = array(
        'Group'
    );
    //var $actsAs = array('Acl' => array('type' => 'requester'));
    var $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['group_id'])) {
            $groupId = $this->data['User']['group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
            return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }

    var $validate = array(
        'username' => array(
            'alphaNumeric' => array(
                //'rule' => 'alphaNumeric',
                'rule' => 'isUnique',
                'required' => true,
                'message' => 'Esse usuário já existe'
            ),
            'between' => array(
                'rule' => array('between', 5, 400),
                'message' => 'Usuário deve ter entre 5 e 25 caracteres'
            )
        ),
        'email' => array(
            'rule' => 'email',
            'message' => 'Você deve entrar um email válido'
        ),
        'password' => array(
            'rule' => array('minLength', 8),
            'message' => 'A senha deve ter pelo menos 8 dígitos'
        ),
        'cpf' => array(
            'Checar' => array(
                'rule' => array('checkcpf'),
                'message' => 'Cpf inválido'
            ),
            'Unico' => array(
                'rule' => 'isUnique',
                'message' => 'Cpf já cadastrado'
            ),
        )
    );

    public function beforeSave($options = array()) {
        if (isset($this->data[$this->alias]['password'])) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        }
        return true;
    }

    public function checkcpf($check) {
        //Etapa 1: Cria um array com apenas os digitos numéricos, isso permite receber o cpf em diferentes formatos como "000.000.000-00", "00000000000", "000 000 000 00" etc...
        $j = 0;
        $num = "";
        for ($i = 0; $i < (strlen($check['cpf'])); $i++) {
            if (is_numeric($check['cpf'][$i])) {
                $num[$j] = $check['cpf'][$i];
                $j++;
            }
        }
        //Etapa 2: Conta os dígitos, um cpf válido possui 11 dígitos numéricos.
        if (count($num) != 11) {
            $isCpfValid = false;
        }
        //Etapa 3: Combinações como 00000000000 e 22222222222 embora não sejam cpfs reais resultariam em cpfs válidos após o calculo dos dígitos verificares e por isso precisam ser filtradas nesta parte.
        else {
            for ($i = 0; $i < 10; $i++) {
                if ($num[0] == $i && $num[1] == $i && $num[2] == $i && $num[3] == $i && $num[4] == $i && $num[5] == $i && $num[6] == $i && $num[7] == $i && $num[8] == $i) {
                    $isCpfValid = false;
                    break;
                }
            }
        }
        //Etapa 4: Calcula e compara o primeiro dígito verificador.
        if (!isset($isCpfValid)) {
            $j = 10;
            for ($i = 0; $i < 9; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $resto = $soma % 11;
            if ($resto < 2) {
                $dg = 0;
            } else {
                $dg = 11 - $resto;
            }
            if ($dg != $num[9]) {
                $isCpfValid = false;
            }
        }
        //Etapa 5: Calcula e compara o segundo dígito verificador.
        if (!isset($isCpfValid)) {
            $j = 11;
            for ($i = 0; $i < 10; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $resto = $soma % 11;
            if ($resto < 2) {
                $dg = 0;
            } else {
                $dg = 11 - $resto;
            }
            if ($dg != $num[10]) {
                $isCpfValid = false;
            } else {
                $isCpfValid = true;
            }
        }
        //Trecho usado para depurar erros.
        /*
          if($isCpfValid==true)
          {
          echo "<font color=\"GREEN\">Cpf é Válido</font>";
          }
          if($isCpfValid==false)
          {
          echo "<font color=\"RED\">Cpf Inválido</font>";
          }
         */
        //Etapa 6: Retorna o Resultado em um valor booleano.
        return $isCpfValid;
    }

}